package com.cy.comstore.mapper;

import com.cy.comstore.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;


/** 处理用户数据操作的持久层接口 */
// @Mapper  有多个持久层接口都要这个注解，不如在启动类上扫描mapper包下的接口
public interface UserMapper {
    /**
     * 插入用户数据
     * @param user 用户数据
     * @return 受影响的行数
     */
    Integer insert(User user);

    /**
     * 根据用户名查询用户数据
     * @param username 用户名
     * @return 匹配的用户数据，如果没有匹配的数据，则返回null
     */
    User findByUsername(String username);

    /**
     * 根据uid更新用户的密码
     * @param uid 用户的id
     * @param password 新密码
     * @param modifiedUser 最后修改执行人
     * @param modifiedTime 最后修改时间
     * @return 受影响的行数
     */
    //方法存在多个参数，所有的参数前面必须加上@Param("基本类型字段名")的注解
    //数据库取参数是从@Param("uid")这里而不是Integer uid
    //引用类型不需要上@Param("基本类型字段名")的注解
    Integer updatePasswordByUid(
            @Param("uid") Integer uid,
            @Param("password") String password,
            @Param("modifiedUser") String modifiedUser,
            @Param("modifiedTime") Date modifiedTime);

    /**
     * 根据用户id查询用户数据
     * @param uid 用户id
     * @return 匹配的用户数据，如果没有匹配的用户数据，则返回null
     */
    User findByUid(Integer uid);

    /**
     * 根据uid更新用户资料
     * @param user 封装了用户id和新个人资料的对象
     * @return 受影响的行数
     */
    Integer updateInfoByUid(User user);

    /**
     * 根据uid更新用户的头像
     * @param uid 用户的id
     * @param avatar 新头像的路径
     * @param modifiedUser 修改执行人
     * @param modifiedTime 修改时间
     * @return 受影响的行数
     */
    //@param（“sql映射文件中#{}占位符的变量名”）：解决的问题是当SQL语句的占位符变量和映射的接口方法参数名不一致时候，
    //需要将某个参数强行注入到某个占位符变量中
    //作用及用法和pathVariouble()一样，注解用来解决数据库和服务器端的代码连接不一致，另一个解决前后端不一致
    //param注解代表后一个值要注入到前边一个值的sql语句占位符当中（例如Integer uid=>#(uid)）
    Integer updateAvatarByUid(
            @Param("uid") Integer uid,
            @Param("avatar") String avatar,
            @Param("modifiedUser") String modifiedUser,
            @Param("modifiedTime") Date modifiedTime);
}
